package ru.compft.web.adapter;

import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import ru.compft.common.data.AppAcl;
import ru.compft.common.data.AppPermission;
import ru.compft.common.utils.GlobalConstants;
import ru.compft.web.beans.PermissionBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * User: ASUS
 * Date: 09.08.12
 * Time: 21:09
 * Адаптер для преобразование бина в объект БД
 */
public class AclAdapter {
    /**
     * Копирование объекта БД в web-бин
     *
     * @param appPermission
     * @param permissionBean
     */
    public static void copyToBean(AppPermission appPermission, PermissionBean permissionBean) {
//        if (permissionBean != null && appPermission != null) {
//
//            permissionBean.setId(appPermission.getId());
//            permissionBean.setCode(appPermission.getCode());
//            permissionBean.setName(appPermission.getName());
//            permissionBean.setDescription(appPermission.getDescription());
//
//            // конвертируем роли
//            final Set<AppRole> appRoleList = appPermission.getRoles();
//            if (!CollectionUtils.isEmpty(appRoleList)) {
//                for (AppRole appRole : appRoleList) {
//                    final RoleBean roleBean = new RoleBean();
//                    RoleAdapter.copyToBean(appRole, roleBean);
//
//                    permissionBean.addRole(roleBean);
//                }
//            }
//        }
    }

    /**
     * Преобразование web-бина в объект БД
     *
     * @param permissionBean
     * @return
     */
    public static AppPermission convertToDataObject(PermissionBean permissionBean) {
//        if (permissionBean != null) {
//            final AppPermission appPermission = new AppPermission();
//
//            appPermission.setId(permissionBean.getId());
//            appPermission.setCode(permissionBean.getCode());
//            appPermission.setName(permissionBean.getName());
//            appPermission.setDescription(permissionBean.getDescription());
//
//            // конвертируем роли
//            final List<RoleBean> roleBeanList = permissionBean.getRoles();
//            if (!CollectionUtils.isEmpty(roleBeanList)) {
//                for (RoleBean roleBean : roleBeanList) {
//                    final AppRole appRole = RoleAdapter.convertToDataObject(roleBean);
//                    if (appRole != null) appPermission.addRole(appRole);
//                }
//            }
//
//            return appPermission;
//        }
        return null;
    }

    /**
     * Преобразуем список прав доступа в массив строк вида {mask}#{id}#{principal}#{sid}
     *
     * @param aclPermissionsForRole
     * @return
     */
    public static String[] convertAclListToStringArray(List<AppAcl> aclPermissionsForRole) {
        final List<String> resultList = new ArrayList<String>();

        if (!CollectionUtils.isEmpty(aclPermissionsForRole)) {
            for (AppAcl appAcl : aclPermissionsForRole) {
                resultList.add(appAcl.format());
            }
        }
        return resultList.toArray(new String[resultList.size()]);
    }

    /**
     * Преобразуем строку формата {mask}#{id}#{principal}#{sid} в список объектов
     *
     * @param permissions
     * @param clazz
     * @return
     */
    public static List<AppAcl> convertPermissionsMatrixToAppAclList(String[] permissions, String clazz) {
        // меп уникальных ключей для AppAcl
        final Map<String, AppAcl> uniqieAppAclMap = new HashMap<String, AppAcl>();

        if (permissions != null && permissions.length > 0 && StringUtils.hasText(clazz)) {
            for (String permissionString : permissions) {
                // парсим строку
                if (StringUtils.hasText(permissionString)) {
                    final String[] splitArray = permissionString.split(GlobalConstants.SHARP);
                    // todo может бросить Exception если не равно 4
                    if (splitArray.length == 4) {
                        final AppAcl appAcl = new AppAcl();

                        final Long mask = Long.valueOf(splitArray[0]);

                        appAcl.setClazz(clazz);
                        appAcl.setObjectId(Long.valueOf(splitArray[1]));
                        appAcl.setPrincipal(Long.valueOf(splitArray[2]));
                        appAcl.setRecipient(splitArray[3]);

                        final String key = appAcl.formatUniqueKey();

                        // добавляем в меп если еще нет
                        if (!uniqieAppAclMap.containsKey(key)) {
                            appAcl.setMask(mask);

                            uniqieAppAclMap.put(key, appAcl);
                        } else {
                            final AppAcl appAclOld = uniqieAppAclMap.get(key);
                            appAclOld.setMask(appAclOld.getMask() + mask);
                        }
                    }
                }
            }
        }
        return new ArrayList<AppAcl>(uniqieAppAclMap.values());
    }
}
